﻿using SIIE_ERP.Codigo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIIE_ERP.BaseDatos.Inventarios.Transacciones
{
    public class Trans_Traspasos
    {
        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion
        
        #region Constructores

        public Trans_Traspasos(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        #endregion

        #region SELECT

        public DataTable Get_Report(int Id_Origen, int Id_Destino, int Estatus, int Tiempo)
        {

            string Query = @"
    
                SELECT
	                dbo_Trans_Traspaso_Almacen_Cab.RFC, 
	                dbo_Trans_Traspaso_Almacen_Cab.Id_Traspaso, 
	                dbo_Trans_Traspaso_Almacen_Cab.Secuencia, 
                    dbo_Trans_Traspaso_Almacen_Cab.Estatus, 
	                dbo_Cat_Estatus.Nombre AS Estatus_Desc, 
	                dbo_Trans_Traspaso_Almacen_Cab.Fecha_Traspaso, 
                    dbo_Trans_Traspaso_Almacen_Cab.Descripcion, 
	                dbo_Trans_Traspaso_Almacen_Cab.Id_Almacen_Origen, 
	                Cat_Almacen_Origen.Descripcion AS Almacen_Origen, 
                    dbo_Trans_Traspaso_Almacen_Cab.Id_Almacen_Destino, 
	                Cat_Almacen_Destino.Descripcion AS Almacen_Destino, 
                    dbo_Trans_Traspaso_Almacen_Linea.Id_Linea_Traspaso, 
	                dbo_Trans_Traspaso_Almacen_Linea.Secuencia AS Secuencia_Linea, 
	                dbo_Trans_Traspaso_Almacen_Linea.Id_Articulo, dbo_Cat_Articulo.Clave AS Clave_Articulo, dbo_Cat_Articulo.Nombre AS Articulo, dbo_Cat_Articulo.NombreTicket, 
	                dbo_Trans_Traspaso_Almacen_Linea.Cantidad, dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std AS Costo_Std, 
	                dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo AS Costo_Ultimo, 
	                dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio AS Costo_Promedio, 
	
	                Switch(
		                dbo_Cat_Articulo.Costo_Pref = '1', 	dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std,
		                dbo_Cat_Articulo.Costo_Pref = '2', 	dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio,
		                dbo_Cat_Articulo.Costo_Pref = '3', 	dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo 
                    )  AS Costo_Preferido, 
	
	                dbo_Trans_Traspaso_Almacen_Linea.Comentarios, 
	                dbo_Cat_Moneda.Clave AS Clave_Moneda, 
	                dbo_Cat_Moneda.Simbolo AS Simbolo_Moneda,
	                dbo_Cat_Moneda.Nombre AS Moneda, 
	                dbo_Cat_Grupo_Productos.Nombre AS Grupo_Producto, 
	                dbo_Cat_Subgrupo_Productos.Nombre AS Subgrupo_Producto, 
	                dbo_Cat_Linea.Nombre AS Linea, 
	                dbo_Cat_Talla.Nombre AS Talla, 
	                dbo_Cat_Color.Nombre AS Color, 
	                dbo_Cat_TipoCambio.TipoCambio

                FROM 

	                ((((((((((((dbo_Trans_Traspaso_Almacen_Cab 
	                INNER JOIN dbo_Trans_Traspaso_Almacen_Linea ON dbo_Trans_Traspaso_Almacen_Cab.Id_Traspaso = dbo_Trans_Traspaso_Almacen_Linea.Id_Traspaso )
	                INNER JOIN dbo_Cat_Almacen AS Cat_Almacen_Origen ON dbo_Trans_Traspaso_Almacen_Cab.Id_Almacen_Origen = Cat_Almacen_Origen.Id_Almacen )
	                INNER JOIN dbo_Cat_Almacen AS Cat_Almacen_Destino ON dbo_Trans_Traspaso_Almacen_Cab.Id_Almacen_Destino = Cat_Almacen_Destino.Id_Almacen )
	                INNER JOIN dbo_Cat_Articulo ON dbo_Trans_Traspaso_Almacen_Linea.Id_Articulo = dbo_Cat_Articulo.Id_Articulo )
	                INNER JOIN dbo_Cat_Moneda ON dbo_Cat_Articulo.Id_Moneda = dbo_Cat_Moneda.Id_Moneda )
	                INNER JOIN dbo_Cat_Estatus ON dbo_Trans_Traspaso_Almacen_Cab.Estatus = dbo_Cat_Estatus.Estatus )
	                INNER JOIN dbo_Cat_Grupo_Productos ON dbo_Cat_Articulo.Id_GrupoProductos = dbo_Cat_Grupo_Productos.Id_GrupoProductos )
	                INNER JOIN dbo_Cat_Subgrupo_Productos ON dbo_Cat_Articulo.Id_SubgrupoProductos = dbo_Cat_Subgrupo_Productos.Id_SubgrupoProductos )
	                INNER JOIN dbo_Cat_Linea ON dbo_Cat_Articulo.Id_Linea = dbo_Cat_Linea.Id_Linea )
	                INNER JOIN dbo_Cat_Talla ON dbo_Cat_Articulo.Id_Talla = dbo_Cat_Talla.Id_Talla )
	                INNER JOIN dbo_Cat_Color ON dbo_Cat_Articulo.Id_Color = dbo_Cat_Color.Id_Color )
	                INNER JOIN dbo_Cat_TipoCambio ON dbo_Cat_Moneda.Id_Moneda = dbo_Cat_TipoCambio.Id_Moneda)

                WHERE 

                    dbo_Trans_Traspaso_Almacen_Cab.RFC = '@@RFC'
                AND (@@Estatus = -1 OR @@Estatus = dbo_Trans_Traspaso_Almacen_Cab.Estatus)
                AND (@@Id_Origen = -1 OR @@Id_Origen = dbo_Trans_Traspaso_Almacen_Cab.Id_Almacen_Origen)
                AND (@@Id_Destino = -1 OR @@Id_Destino = dbo_Trans_Traspaso_Almacen_Cab.Id_Almacen_Destino)
                
                AND 
				(
				(@@Tiempo = 1 and Year(dbo_Trans_Traspaso_Almacen_Cab.Fecha_Alta) = Year(NOW()) and Month(dbo_Trans_Traspaso_Almacen_Cab.Fecha_Alta) = Month(NOW())) or
				(@@Tiempo = 2 and Year(dbo_Trans_Traspaso_Almacen_Cab.Fecha_Alta) = Year(DateAdd('m',-1,NOW())) and Month(dbo_Trans_Traspaso_Almacen_Cab.Fecha_Alta) = Month(DateAdd('m',-1,NOW()))) or
				(@@Tiempo = 3 and Year(dbo_Trans_Traspaso_Almacen_Cab.Fecha_Alta) = Year(NOW())) or
				(@@Tiempo = 4 and Year(dbo_Trans_Traspaso_Almacen_Cab.Fecha_Alta) = Year(DateAdd('yyyy',-1,NOW()))) or
				(@@Tiempo = 5)
				)                  
            ";

            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@Id_Origen", Id_Origen.ToString());
            Query = Query.Replace("@@Id_Destino", Id_Destino.ToString());
            Query = Query.Replace("@@Estatus", Estatus.ToString());
            Query = Query.Replace("@@Tiempo", Tiempo.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }


        public DataTable Get_Report(int Id_Traspaso)
        {

            string Query = @"
    
                SELECT
	                dbo_Trans_Traspaso_Almacen_Cab.RFC, 
	                dbo_Trans_Traspaso_Almacen_Cab.Id_Traspaso, 
	                dbo_Trans_Traspaso_Almacen_Cab.Secuencia, 
                    dbo_Trans_Traspaso_Almacen_Cab.Estatus, 
	                dbo_Cat_Estatus.Nombre AS Estatus_Desc, 
	                dbo_Trans_Traspaso_Almacen_Cab.Fecha_Traspaso, 
                    dbo_Trans_Traspaso_Almacen_Cab.Descripcion, 
	                dbo_Trans_Traspaso_Almacen_Cab.Id_Almacen_Origen, 
	                Cat_Almacen_Origen.Descripcion AS Almacen_Origen, 
                    dbo_Trans_Traspaso_Almacen_Cab.Id_Almacen_Destino, 
	                Cat_Almacen_Destino.Descripcion AS Almacen_Destino, 
                    dbo_Trans_Traspaso_Almacen_Linea.Id_Linea_Traspaso, 
	                dbo_Trans_Traspaso_Almacen_Linea.Secuencia AS Secuencia_Linea, 
	                dbo_Trans_Traspaso_Almacen_Linea.Id_Articulo, dbo_Cat_Articulo.Clave AS Clave_Articulo, dbo_Cat_Articulo.Nombre AS Articulo, dbo_Cat_Articulo.NombreTicket, 
	                dbo_Trans_Traspaso_Almacen_Linea.Cantidad, dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std AS Costo_Std, 
	                dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo AS Costo_Ultimo, 
	                dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio AS Costo_Promedio, 
	
	                Switch(
		                dbo_Cat_Articulo.Costo_Pref = '1', 	dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Std,
		                dbo_Cat_Articulo.Costo_Pref = '2', 	dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Promedio,
		                dbo_Cat_Articulo.Costo_Pref = '3', 	dbo_Trans_Traspaso_Almacen_Linea.Cantidad * dbo_Cat_Articulo.Costo_Ultimo 
                    )  AS Costo_Preferido, 
	
	                dbo_Trans_Traspaso_Almacen_Linea.Comentarios, 
	                dbo_Cat_Moneda.Clave AS Clave_Moneda, 
	                dbo_Cat_Moneda.Simbolo AS Simbolo_Moneda,
	                dbo_Cat_Moneda.Nombre AS Moneda, 
	                dbo_Cat_Grupo_Productos.Nombre AS Grupo_Producto, 
	                dbo_Cat_Subgrupo_Productos.Nombre AS Subgrupo_Producto, 
	                dbo_Cat_Linea.Nombre AS Linea, 
	                dbo_Cat_Talla.Nombre AS Talla, 
	                dbo_Cat_Color.Nombre AS Color, 
	                dbo_Cat_TipoCambio.TipoCambio

                FROM 

	                ((((((((((((dbo_Trans_Traspaso_Almacen_Cab 
	                INNER JOIN dbo_Trans_Traspaso_Almacen_Linea ON dbo_Trans_Traspaso_Almacen_Cab.Id_Traspaso = dbo_Trans_Traspaso_Almacen_Linea.Id_Traspaso )
	                INNER JOIN dbo_Cat_Almacen AS Cat_Almacen_Origen ON dbo_Trans_Traspaso_Almacen_Cab.Id_Almacen_Origen = Cat_Almacen_Origen.Id_Almacen )
	                INNER JOIN dbo_Cat_Almacen AS Cat_Almacen_Destino ON dbo_Trans_Traspaso_Almacen_Cab.Id_Almacen_Destino = Cat_Almacen_Destino.Id_Almacen )
	                INNER JOIN dbo_Cat_Articulo ON dbo_Trans_Traspaso_Almacen_Linea.Id_Articulo = dbo_Cat_Articulo.Id_Articulo )
	                INNER JOIN dbo_Cat_Moneda ON dbo_Cat_Articulo.Id_Moneda = dbo_Cat_Moneda.Id_Moneda )
	                INNER JOIN dbo_Cat_Estatus ON dbo_Trans_Traspaso_Almacen_Cab.Estatus = dbo_Cat_Estatus.Estatus )
	                INNER JOIN dbo_Cat_Grupo_Productos ON dbo_Cat_Articulo.Id_GrupoProductos = dbo_Cat_Grupo_Productos.Id_GrupoProductos )
	                INNER JOIN dbo_Cat_Subgrupo_Productos ON dbo_Cat_Articulo.Id_SubgrupoProductos = dbo_Cat_Subgrupo_Productos.Id_SubgrupoProductos )
	                INNER JOIN dbo_Cat_Linea ON dbo_Cat_Articulo.Id_Linea = dbo_Cat_Linea.Id_Linea )
	                INNER JOIN dbo_Cat_Talla ON dbo_Cat_Articulo.Id_Talla = dbo_Cat_Talla.Id_Talla )
	                INNER JOIN dbo_Cat_Color ON dbo_Cat_Articulo.Id_Color = dbo_Cat_Color.Id_Color )
	                INNER JOIN dbo_Cat_TipoCambio ON dbo_Cat_Moneda.Id_Moneda = dbo_Cat_TipoCambio.Id_Moneda)

                WHERE 

                    dbo_Trans_Traspaso_Almacen_Cab.Id_Traspaso = @@Id              
            ";

            Query = Query.Replace("@@Id", Id_Traspaso.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }


        public DataTable Get_Trans_Traspasos()
        {

            string Query = @"SELECT 
                                A1.*,
                                A2.Descripcion as Desc_Origen,
                                A3.Descripcion as Desc_Destino
                             FROM ((
                                dbo_Trans_Traspaso_Almacen_Cab AS A1
                                    INNER JOIN dbo_Cat_Almacen AS A2 ON A1.Id_Almacen_Origen  = A2.Id_Almacen)
                                    INNER JOIN dbo_Cat_Almacen AS a3 ON A1.Id_Almacen_Destino = A3.Id_Almacen
                             )
                            WHERE A1.RFC = '@@RFC' ORDER BY A1.Id_Traspaso DESC";
            Query = Query.Replace("@@RFC", this._RFC);

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Trans_Traspasos_Por_Id(int Id)
        {

            string Query = @"SELECT 
                                A1.*,
                                A2.Descripcion as Desc_Origen,
                                A3.Descripcion as Desc_Destino
                             FROM ((
                                dbo_Trans_Traspaso_Almacen_Cab AS A1
                                    INNER JOIN dbo_Cat_Almacen AS A2 ON A1.Id_Almacen_Origen  = A2.Id_Almacen)
                                    INNER JOIN dbo_Cat_Almacen AS a3 ON A1.Id_Almacen_Destino = A3.Id_Almacen
                             )
                            WHERE A1.RFC = '@@RFC' AND Id_Traspaso = @@IdTraspaso";
            Query = Query.Replace("@@RFC", this._RFC);
            Query = Query.Replace("@@IdTraspaso", Id.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public DataTable Get_Trans_Traspaso_Lineas(int Id_Traspaso)
        {

            string Query = "SELECT A1.*, A2.Nombre as Desc_Articulo FROM (dbo_Trans_Traspaso_Almacen_Linea as A1 INNER JOIN dbo_Cat_Articulo as A2 ON A1.Id_Articulo=A2.Id_Articulo) WHERE Id_Traspaso = @@Id_MovInventario";
            Query = Query.Replace("@@Id_MovInventario", Id_Traspaso.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }

        #endregion

        #region INSERT

        public Respuesta Insert_Trans_Traspasos(
            DateTime Fecha,
            EstatusDocs_Id Estatus,
            string Id_Almacen_Origen,
            string Id_Almacen_Destino,
            string Descripcion
            )
        {
            try
            {
                string Query = @"

                INSERT INTO dbo_Trans_Traspaso_Almacen_Cab
                (
                    Id_Traspaso,
	                RFC,
	                Secuencia,
	                Fecha_Traspaso,
	                Estatus,
	                Id_Almacen_Origen,
	                Id_Almacen_Destino,
                    Descripcion,
	                Partidas,
	                UserHostAddress,
	                Fecha_Alta,
	                Usuario_Alta,
	                Fecha_Mantto,
	                Usuario_Mantto
                )
                VALUES
                (
                    IIF(DCount('*', 'dbo_Trans_Traspaso_Almacen_Cab') = 0, 1, DMax('Id_Traspaso', 'dbo_Trans_Traspaso_Almacen_Cab') + 1),
                    '@@RFC',
                    IIF(DCount('*', 'dbo_Trans_Traspaso_Almacen_Cab', ""RFC = '@@RFC'"") = 0, 1, DMax('Id_Traspaso', 'dbo_Trans_Traspaso_Almacen_Cab', ""RFC = '@@RFC'"") + 1),
	                '@@Fecha',
	                '@@Estatus',
	                @@IdOrigen,
	                '@@IdDestino',
                    '@@Descripcion',
	                @@Partidas,
	                '',
                    NOW(),
                    '@@Usuario_Alta',   
                    NOW(),
                    '@@Usuario_Mantto'
                )";

                Query = Query.Replace("@@RFC", this._RFC);

                Query = Query.Replace("@@Fecha", Fecha.ToString());
                Query = Query.Replace("@@Estatus", Estatus.GetHashCode().ToString());

                Query = Query.Replace("@@IdOrigen", Id_Almacen_Origen);
                Query = Query.Replace("@@IdDestino", Id_Almacen_Destino);

                Query = Query.Replace("@@Descripcion", Descripcion.Replace("'", "''"));
                Query = Query.Replace("@@Partidas", "0");

                Query = Query.Replace("@@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        public Respuesta Insert_Trans_Traspaso_Linea(
            int Id_Inv_Fisico,
            int Id_Articulo,
            double Cantidad,
            string Comentarios
        )
        {
            try
            {
                string Query = @"

                INSERT INTO dbo_Trans_Traspaso_Almacen_Linea
                (   
	                	Id_Linea_Traspaso,
	                    RFC,
	                    Id_Traspaso,
	                    Secuencia,
	                    Id_Articulo,
	                    Cantidad,
	                    Comentarios,
	                    Fecha_Alta,
	                    Usuario_Alta,
	                    Fecha_Mantto,
	                    Usuario_Mantto
                )
                VALUES
                (
                    IIF(DCount('*', 'dbo_Trans_Traspaso_Almacen_Linea') = 0, 1, DMax('Id_Linea_Traspaso', 'dbo_Trans_Traspaso_Almacen_Linea') + 1),
                    '@@RFC',
                    @@Id_Padre,
                    IIF(DCount('*', 'dbo_Trans_Traspaso_Almacen_Linea', ""Id_Linea_Traspaso = @@Id_Padre"") = 0, 1, DMax('Id_Linea_Traspaso', 'dbo_Trans_Traspaso_Almacen_Linea', ""Id_Linea_Traspaso = @@Id_Padre"") + 1)                ,
                    @@Id_Articulo,
	                @@Cantidad,
                    '@@Comentarios',
                    NOW(),
                    '@@Usuario_Alta',
                    NOW(),
                    '@@Usuario_Mantto'
                )";

                Query = Query.Replace("@@RFC", this._RFC);
                Query = Query.Replace("@@Id_Padre", Id_Inv_Fisico.ToString());
                Query = Query.Replace("@@Id_Articulo", Id_Articulo.ToString());
                Query = Query.Replace("@@Cantidad", Cantidad.ToString());
                Query = Query.Replace("@@Comentarios", Comentarios.Replace("'", "''"));
                Query = Query.Replace("@@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        #endregion

        #region UPDATE

        public Respuesta Update_Estatus_Traspaso(Int32 Id, EstatusDocs_Id estatus)
        {
            string Query = @"UPDATE dbo_Trans_Traspaso_Almacen_Cab SET
                                Estatus = @@Estatus
                            WHERE Id_Traspaso = @@Id
                            ";

            Query = Query.Replace("@@Estatus", estatus.GetHashCode().ToString());
            Query = Query.Replace("@@Id", Id.ToString());

            return SrvDB.ExecuteQuery_Update(Query);
        }


        #endregion

        #region DELETE
        public Respuesta Delete_Trans_Traspaso_Linea(
           object Id
       )
        {
            try
            {
                string Query = @"DELETE FROM dbo_Trans_Traspaso_Almacen_Linea 
                                    WHERE Id_Linea_Traspaso = @@Id";

                Query = Query.Replace("@@Id", ((Int32)Id).ToString());
                return SrvDB.ExecuteQuery_Delete(Query);


            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        public Respuesta Delete_Trans_Transpaso(
            object Id
            )
        {
            try
            {
                string Query = @"DELETE FROM dbo_Trans_Traspaso_Almacen_Cab
                                    WHERE Id_Traspaso = @@Id";

                Query = Query.Replace("@@Id", ((Int32)Id).ToString());
                return SrvDB.ExecuteQuery_Delete(Query);


            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }
        #endregion

    }
}
